package com.rose.redis._data_structure.list;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * Redis的List
 * 一：类似于Java的LinkedList，底层都是基于链表的。
 *
 * 二：使用场景
 * 1：消息队列：lpop和rpush（或者反过来，lpush和rpop）能实现队列的功能
 * 2：朋友圈的点赞列表、评论列表、排行榜：lpush命令和lrange命令能实现最新列表的功能，每次通过lpush命令往列表里插入新的元素，然后通过lrange命令读取最新的元素列表。
 *
 * 三：常用命令
 * 1：lpush [key] [value1] [value2] ......：链表左侧插入，可以认为是链表头部
 * 2：lpop [key]：移除左侧列表头元素，可以认为是链表头部，并返回该元素
 * 3：rpush [key] [value1] [value2] ......：链表右侧插入。
 * 4：rpop [key]：移除右侧列表头元素，并返回该元素。
 * 5：llen [key]：返回该列表的元素个数。
 * 6：lrem [key] [count] [value]：删除列表中与value相等的元素，count是删除的个数。 count>0 表示从左侧开始查找，删除count个元素，count<0 表示从右侧开始查找，删除count个相同元素，count=0 表示删除全部相同的元素:
 * (PS: index 代表元素下标，index 可以为负数， index=-1 表示倒数第一个元素，同理 index=-2 表示倒数第二 个元素。)
 * 7：lindex [key] [index]：获取list指定下标的元素 （需要遍历，时间复杂度为O(n)）
 * 8：lrange [key] [start_index] [end_index]：获取list 区间内的所有元素 （时间复杂度为 O（n））
 * 9：ltrim [key] [start_index] [end_index]：保留区间内的元素，其他元素删除（时间复杂度为 O（n））
 *
 * @author: zhu.chen
 * @date: 2021/1/5
 * @version: v1.0.0
 */
//@Component
public class TestListCommandLineRunner implements CommandLineRunner {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void run(String... args) throws Exception {
        stringRedisTemplate.opsForList().leftPush("name", "xiaoming");
        stringRedisTemplate.opsForList().leftPush("name", "zhangsan");
        stringRedisTemplate.opsForList().leftPush("name", "zhuchen");
        System.out.println(stringRedisTemplate.opsForList().range("name", 0, 2).toString());
//        stringRedisTemplate.opsForList().leftPush("name","xiaoming");
//        stringRedisTemplate.opsForList().leftPush("name","xiaohong");
//        stringRedisTemplate.opsForHash().put("account","username","zhangsan");
//        System.out.println(stringRedisTemplate.opsForHash().get("account", "username"));
    }

}
